home *** CD-ROM | disk | FTP | other *** search
- GEOS Technical Reference Notes
- December, 1987
-
- This document provides some preliminary information about the differences
- between C64 GEOS and C128 GEOS. It is not intended to be comprehensive;
-
- Compatibility with C64 GEOS software
- ------------------------------------
- Most C64 GEOS software will run under the C128 GEOS in 40 column mode.
-
- All data files, scraps, fonts, & printer drivers are identical under
- C64 and C128 GEOS.
-
- Input drivers are located at different addresses in the two machines, and
- hence are incompatible. We have added a new file type, INPUT128, for C128
- input drivers.
-
- As the deskTop is heavily tied into each OS, we've decided to give the 128
- it's own desktop filename, "128 DESKTOP", so as to avoid confusion with the 64's
- "DESK TOP" file. (The deskTop is of file type "SYSTEM", and can't be renamed
- by the user).
-
-
- 128 Flags for Applications & Desk Accessories
- ---------------------------------------------
- In order for the 128 DESKTOP & other applications to know what files run in
- what mode, we've adopted a standard that should be used on ALL applications,
- desk accessories, & auto-execution programs. This flag is located in the
- header block of each of these programs. Since permanent file names are only
- 16 bytes long, we have left over 4 bytes that have been unused till now, but
- we've constantly been setting them to all 0's. The last of these bytes
- (see OFF128FLAGS) now has meaning to the 128 OS & DeskTop:
-
- B7 B6
- 0 0 runs under 128 GEOS, but in 40 column mode only
- 0 1 runs under 128 GEOS in 40 and 80 column modes
- 1 0 DOES NOT RUN under 128 GEOS (deskTop will display dialog box)
- 1 1 runs under 128 GEOS in 80 column mode only
-
- Bits 5 through 0 are unused and should be 0. The 128 GEOS routines LdApplic
- and LdDeskAcc will return the error #INCOMPATIBLE if these flags in the header
- block do not allow running in the current mode.
-
-
- Converting 64 GEOS software to run on the C128
- ----------------------------------------------
- First, you need to decide whether your software is simply going to be able
- to run in 40 col. mode, or whether it is to run in 40/80 column on the 128 only.
-
- 40 col. mode only on 128:
-
- 1) Chances are quite good your software already does.
-
- 2) If it doesn't, it's probably becuase you access BASIC -- the 128 has a
- different BASIC, so you'll need to re-write that section of code to first see
- which OS you're running under, & then use the appropriate BASIC variables &
- jump entries.
-
- 40/80 col. on the C128 only:
-
- 1) Set the 128 flag as mentioned above in the save file to $40
-
- 2) In 80 column mode, you'll need to widen your menus to accomodate the wider
- system font. We typically stuff these "right edge" values into the menu
- structure itself based on the current graphicsMode
- ($80 is 80 column, $00 is 40)
-
- 3) Most of the graphic changes you'll need to make can be accomplished by
- setting the high bit of every X position or width that you pass to the operating
- system. The 128 GEOS will ignore this bit if in 40 column mode, and double the
- value if in 80 column mode, thus automatically retaining the same sized image
- on the screen. Hence, 50+$8000 is 50 pixels in 40 column mode and 100 pixels in
- 80 column mode.
-
- 4) If you're writing an application, add a "switch 40/80" option under the
- geos menu. The action for this should be to EOR graphicsMode with $80,
- store it back, and call the routine SetNewMode. You'll then need to redraw the
- screen, now in the new graphics mode.
-
- 5) Nearly all x positions passed to the C128 GEOS can have the high bit set
- causing the position to automatically be doubled in 80 column mode. It has
- been noted that this always results in the low bit of the resulting word being
- a 0. This can make life difficult, if you desire to fill a pattern to the
- right edge of the screen, for instance. To solve this problem, I've modified
- the normalization routine: The 15th bit of the word continues to be the same
- "double me if 80 col." flag, but the 14th bit now has significance in 80 col.
- mode only -- it becomes the low bit of the doubled word. So, if you want the
- right edge of the screen, use the value $C000+319.
-
-
- Sprites
- -------
- The C64 contains a chip to handle sprites in hardware. Unfortunately, this chip
- is not available on the 128, so the functions of that chip have been simulated
- in software that is included in the 128 kernal. Most of the capabilities of
- the VIC chip have been taken care of, and if you are not doing exotic things
- with sprites your code may work with one or two changes.
-
- The major changes include: sprite 0 (the cursor) is treated differently than
- any other sprite. The code for this beast has been optimized to get reasonably
- fast mouse response, with a resulting loss in functionality. You cannot double
- the cursor's size in either x or y. You cannot change the color of the cursor.
- The size of the cursor is limited to 16-pixels wide and 8 lines high. One
- added feature is the ability to add a white outline to the picture that is used
- for the cursor. This allows it to be seen while moving over a black
- background.
-
- For the other 7 sprites, all the capabilities have been emulated except for
- color and collision detection. In addition, the 64th byte of the sprite
- picture definition (previously unused) is now used to provide some size info
- about the sprite. This is used to optimize the drawing code. Here are some
- problem areas to watch out for:
-
- Writing directly to the screen:
-
- Since the old sprite were handled with hardware, writing to the screen wasn't
- a problem. If you do it (system calls NOT included), then call "TempHideMouse"
- before the write. This will erase the cursor and any sprites you have enabled.
- You don't have to do anything to get them back, this is done automatically
- during the next main loop.
-
- All sprite picture data:
-
- All picture data should be adjusted to include the 64th byte. This byte has
- size information that is read by the software sprite routines, even if they
- are garbage values. The format of this byte is: high bit set means that the
- sprite is no more that 9 pixels wide (this means it can be shifted 7 times
- and still be contained in 2 bytes). The rest of the byte is a count of the
- scan lines in the sprite. You can either include this info as part of the
- picture definition, or stuff it into the right place with some special code.
-
- Writing directly to the VIC chip:
-
- This is generally ok, since the sprite emulation routines take the position
- and doubling info from the registers on the VIC chip, with the exception of the
- x position. The VIC chip allows 9 bits for x positions, which is not enough
- 640-wide screen. You should write the x position to the global variables
- "reqXpos0, reqXpos1..." (request x pos). These are full words, in consecutive
- locations. Better yet, use the "PosSprite" call in the kernel.
-
- Reading values from the VIC chip:
-
- This is also ok for the status values and for the y position. The x position
- can be useful also, if you use the PosSprite call. In addition to filling
- the global variables reqXpos0, etc., this call divides the x position by two
- and stuffs it into the VIC chip.
-
- Using VIC chip collision detection:
-
- This is iffy. The chip continues to operate, so if you are using the
- PosSprite call (see above) collisions should be detected with some loss of
- accuracy (the low bit). This has not been tested, so if you try it -- report
- the results here.
-
- Writing to the VIC chip (or calling PosSprite, EnablSprite, DisablSprite)
- at interrupt level:
-
- Don't do it. Since the mouse and the sprites are drawn at main loop, this
- causes subtle, irreproducable timing bugs that are impossible to get out.
-
- Known bugs in release 1 of GEOS 128
- -----------------------------------
-
- 1) If location $1300 in application space is zero, then sprites in 80 column
- mode go haywire. All of our current applications that run in 80 column
- mode have put in a patch for this. Bug is in sprite code.
-
- 2) Doubling bitmaps through BitmapClip doesn't work.
-
- 3) iBitmapClip needs call to TempHideMouse before being called.
-
-
- ;**************************************************************************
- ;This file contains additional memory map definitions for applications which
- ;will run under the GEOS 128 kernal. 12/11/87.
- ;**************************************************************************
-
- ;Memory-management unit in C-128
-
- mmu= $D500
- VDC= $D600
-
- ;Address of memory-map configuration register in C-128
-
- config= $FF00
-
- ;Misc addresses:
-
- keyreg= $d02f;C-128 keyboard register for # pad & other keys
- clkreg= $d030;C-128 clock speed register
-
- ;Address of input driver
-
- MOUSEBASE= $FD00
- ENDMOUSE= $FE80
-
- ;Note that the jump table entries for input driver routines have not moved;
- ;They are still at MOUSEJMP ($FE80). In 128 GEOS, there is one additional
- ;vector:
-
- SetMouse= MOUSEJMP+9;($FE89)
-
- ;Jump addresses within disk drivers -- these are only valid for non-1541
- ;disk drive types, and for the 128 version of the 1541 driver:
-
- Get1stDirEntry= $9030;returns first dir entry
- GetNxtDirEntry= $9033;returns next dir entry
- AllocateBlock= $9048;allocates specific block
- ReadLink= $904B;like ReadBlock, but returns only 1st two bytes
-
- ;The following address holds info about the current 128 graphics mode:
- ;$00 for VIC, $80 for VDC 640*200, and $C0 for VDC 640*400 (not yet supported).
-
- graphicsMode= $003f;holds current 128 graphics mode
-
- ;Misc vectors:
-
- JmpIndX= $9D80;address of routine used by 128 kernal
-
- ;-----------------------------------------------------------------------------
- ;This is a second GLOBAL memory area for GEOS. It is here so that these
- ;variables may be in the same place in V1.3 as they are running V1.2 with
- ;the V1.3 deskTop. This allows other input drivers to be auto-booted by
- ;those who have a V1.2 GEOS KERNAL, but have gotten the V1.3 deskTop via
- ;a download or up-grade disk. They are EQUATED to be past the local GEOS
- ;variables, in fact at the end of the GEOS RAM space. Here they must
- ;permanently reside, for the sake of compatibility.
-
-
- ;Saved value of moby2 for context saving done in dlg boxes & desk accessories.
- ;Left out of original GEOS save code, put here so we don't screw up desk
- ;accessories, etc, that know the size of TOTSRAMSAVED above.
-
- savedmoby2= $88bb
-
- ;copy of reg 24 in VDC for C128
-
- screen80polarity= $88bc
-
- ;Screen colors for 80 column mode on C128. Copy of reg 26 in VDC
-
- screen80colors= $88bd
-
- ;Holds current color mode for C128 color routines.
-
- vdcClrMode= $88be
-
- ;(4 bytes) 1 byte each reserved for disk drivers about each device
- ;(each driver may use differently)
-
- driveData= $88bf
-
- ;Number of 64K ram banks available in Ram Expansion Unit. 0 if none available.
- ramExpSize= $88c3
-
- ;If RAM expansion is in, Bank 0 is reserved for the kernal's use. This byte
- ;contains flags designating its usage:
- ;
- ; Bit 7: if 1, $0000-$78FF used by MoveData routine
- ; Bit 6: if 1, $8300-$B8FF holds disk drivers for drives A through C
- ; Bit 5: if 1, $7900-$7DFF is loaded with GEOS ram area $8400-$88FF by ToBasic
- ;routine when going to BASIC
- ; Bit 4: if 1, $7E00-$82FF is loaded with reboot code by a setup AUTO-EXEC
- ;file, which is loaded by the restart code in GEOS at $C000 if
- ;this flag is set, at $6000, instead of loading GEOSBOOT.
- ;Also, in the area $B900-$FC3F is saved the kernal for fast
- ;re-boot without system disk (depending on setup file).
- ;This area should be updated when input devices are changed
- ;(implemented in V1.3 deskTop)
-
- sysRAMFlg= $88c4
-
- ;This flag is changed from 0 to $FF after deskTop comes up for the first time
- ;after booting.
-
- firstBoot= $88c5
-
- ;(4 bytes) Current disk type for each drive (copied from diskType)
-
- curType= $88c6
-
- ;(4 bytes) RAM bank for each disk drive to use if drive type is RAM DISK
- ;or Shadowed Drive
-
- ramBase= $88c7
-
- ;(17 bytes) Holds name of current input device
-
- inputDevName= $88cb
-
- ;(18 bytes) Disk name of disk in drive C. (Padded with $a0)
- DrCCurDkNm= $88dc
-
- ;(18 bytes) Disk name of disk in drive D. (Padded with $a0)
- DrDCurDkNm= $88ee
-
- ;(256 bytes) 2nd directory header block, for larger disk capacity drives
- ;(such as 1571)
- dir2Head= $8900
-
- ;-----------------------------------------------------------------------------
-
-
- ;**************************************************************************
- ;This file contains additional jump-table entries for applications which
- ;will run under the GEOS 128 kernal. 12/11/87.
- ;**************************************************************************
-
- TempHideMouse= $c2d7
- SetMousePicture= $c2da
- SetNewMode= $c2dd
- NormalizeX= $c2e0
- MoveBData= $c2e3
- SwapBData= $c2e6
- VerifyBData= $c2e9
- DoBOp= $c2ec
- AccessCache= $c2ef
- HideOnlyMouse= $c2f2
- SetColorMode= $c2f5
- ColorCard= $c2f8
- ColorRectangle= $c2fb
-
-
- ;**************************************************************************
- ;This file contains additional constant definitions for applications which
- ;will run under the GEOS 128 kernal. 12/11/87
- ;**************************************************************************
-
- ;The following equates define the numbers written to the "config"
- ;register (location $FF00 in C-128). This register controls the memory map
- ;of the C-128.
- CIOIN= $7E;60K RAM, 4K I/O space in
- CRAM64K= $7F;64K RAM
- CKRNLBASIOIN= $40;kernal, I/O and basic ROM's mapped into memory
- CKRNLIOIN= $4E;Kernal ROM and I/O space mapped in
-
- ;Keyboard equates
- KEYHELP= 25
- KEYALT= 26
- KEYESC= 27
- KEYNOSCRL= 7
- KEYENTER= 11
-
- ;128 screen size constants
- SCREENBYTEWIDTH= 80
- SCREENPIXELWIDTH= 640
-
- ;New GEOS file types:
- INPUT128= 15;128 Input driver
-
- ;New # of file types, including NONGEOS (=0)
- NUMFILETYPES= 16
-
- ;The following equate can be used as an offset into a file's header block.
- ;It points to the byte which contains flags which indicate if the program
- ;will run under C-128 GEOS in 40 and/or 80 column modes. These flags are valid
- ;for applications, desk accessories, and auto-exec files.
- ;
- ;B7 B6
- ; 0 0 runs under 128 GEOS, but in 40 column mode only
- ; 0 1 runs under 128 GEOS in 40 and 80 column modes
- ; 1 0 DOES NOT RUN under 128 GEOS (deskTop will display dialog box)
- ; 1 1 runs under 128 GEOS in 80 column mode only
- OFF128FLAGS= 96
-
- ;disk equates
- DIR1581TRACK= 40;track # reserved on 1581 disk for directory
- DRV1581= 3;Drive type Commodore 1581
- DRVNETWORK= 15;Drive type for GEOS geoNet "drive"
-
- ;equate for error value which indicates an attempt has been made to load
- ;an application which cannot be run under the current C128 graphics mode.
- INCOMPATIBLE= 14
-